package com.lyh.mapper;

import com.lyh.pojo.Order;
import com.lyh.pojo.Route;
import com.lyh.pojo.Seat;
import com.lyh.pojo.Ticket;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

@Mapper
@Repository
public interface TicketMapper {

    /**
     * 分页查询车票
     * @param from 出发地
     * @param to 到达地
     * @param viaTable 路线表名
     * @param trainTable 火车表名
     * @param first 首条记录
     * @param last 最后一条记录
     */
    List<Route> queryRoutesByStation(@Param("from") String from,@Param("to") String to,
                                     @Param("via_table") String viaTable, @Param("train_table") String trainTable,
                                    @Param("first") int first, @Param("last") int last, @Param("type")String highSpeed);

    /**
     * 精确查询车票
     */
    List<Route> queryRoutesByStationPrecise(@Param("from") String from,@Param("to") String to,
                                            @Param("via_table") String viaTable, @Param("train_table") String trainTable,
                                            @Param("first") int first, @Param("last") int last, @Param("type")String highSpeed);

    /**
     * 查询符合记录的条数
     */
    int queryRoutesCount(@Param("from") String from,@Param("to") String to,
                         @Param("via_table") String viaTable, @Param("train_table") String trainTable,
                         @Param("type")String highSpeed);

    /**
     * 精确查询条数
     */
    int queryRoutesCountPrecise(@Param("from") String from,@Param("to") String to,
                                @Param("via_table") String viaTable, @Param("train_table") String trainTable,
                                @Param("type")String highSpeed);

    List<Route> queryAllRoutesByStation(@Param("from") String from,@Param("to") String to,
                                        @Param("via_table") String viaTable, @Param("train_table") String trainTable);

    List<Route> previousQueryRoutesByStation(@Param("from") String from,@Param("to") String to,
                                     @Param("via_table") String viaTable);

    /**
     * 通过user_id来查询个人购买的票
     */
    List<Ticket> queryTicketByUserId(Map<String,String> map);

    /**
     * 通过train_id和type查询剩余座位个数
     * @param map trainId,type,table
     * @return 返回剩余票数
     */
    Seat checkSeat(Map<String,String> map);

    /**
     * 通过train_id减少一个座位数目
     * @param params trainId,type(座位类型),table(什么日期的train表),left(剩下多少张票)
     */
    int updateSeatLeft(Map<String,String> params);

    /**
     * 创建一个订单
     * @param params
     */
    int createOrder(Map<String, String> params);

    /**
     * 根据用户信息跟路线信息查询出一张完整的票
     * @param params user_id via_id table
     */
    Ticket queryTicketInfoById(Map<String, String> params);

    /**
     * 查询该用户是否有未字符订单的数量
     */
    int checkUnpaidOrder(Map<String, String> params);

    /**
     * 创建票
     */
    int createTicket(Ticket ticket);

    /**
     * 查看该订单的支付状态
     */
    int checkOrder(@Param("orderId") int orderId);
    /**
     * 支付订单
     */
    int payOrder(@Param("orderId") int orderId);


    /**
     *  通过用户id查询用户相应状态的订单号
     * @param userId 用户id
     * @param status 支付状态
     * @return 订单号
     */
    List<Integer> queryOrderByUserId(@Param("userId") int userId,@Param("status") int status);

    /**
     * 查询该用户全部orderId
     */
    List<Integer> queryAllOrderByUserId(@Param("userId") int userId);

    /**s
     * 通过orderId查询未支付的列车票信息
     */
    List<Ticket> getTicketsByOrderId(List<Integer> paidList);

    int payTicket(@Param("orderId") int id);

    /**
     * 恢复座位数量
     * @param trainTable 列车表名
     * @param trainId 火车主键号
     * @param seatType 座位类型
     */
    int recoverSeat(@Param("trainTable") String trainTable, @Param("trainId") int trainId, @Param("seatType") String seatType);

    /**
     * 修改订单的状态为已退款
     * @param oid 订单号
     */
    int refundOrder(@Param("orderId") int oid, @Param("userId") Integer userId);

    /**
     * 修改车票状态为已退款
     * @param oid 订单号
     */
    int refundTicket(@Param("orderId") int oid);

    /**
     * 通过oid和uid查询order
     * @param oid 订单号
     * @param userId 用户号
     * @return 订单详情
     */
    Order queryOrderByUidAndOid(@Param("orderId") int oid,@Param("userId") Integer userId);

    /**
     * 将订单状态修改为3过期
     */
    int outdateOrder(int orderId);

    /**
     * 修改ticket变为过期状态
     */
    int outdateTicket(int orderId);

    /**
     * 删除车票方法
     */
    int deleteTicket(int orderId);

    /**
     * 删除订单方法
     */
    int deleteOrder(int orderId);
}
